package com.xiaolun.nio;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/*
说明
1. MappedByteBuffer 可让文件直接在内存(堆外内存)修改, 操作系统不需要拷贝一次
 */
public class MappedByteBufferTest {
	public static void main(String[] args) throws Exception {
        //RandomAccessFile:所谓动态读取是指从文件的任意位置开始访问文件，而不是必须从文件开始位置读取到文件末尾
		RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw");
		//获取对应的通道
		FileChannel channel = randomAccessFile.getChannel();

		/**
		 * 参数1: FileChannel.MapMode.READ_WRITE 使用的读写模式
		 * 参数2： 0： 可以直接修改的起始位置
		 * 参数3:  5: 是映射到内存的大小(不是索引位置) ,即将 1.txt 的多少个字节映射到内存
		 * 可以直接修改的范围就是 0-5(不包含5，包含时会有下面的报错)
		 * 实际类型 DirectByteBuffer
		 */
		MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

		//hello -> Hel9o
		mappedByteBuffer.put(0, (byte) 'H');
		mappedByteBuffer.put(3, (byte) '9');
//		mappedByteBuffer.put(5, (byte) 'Y');//IndexOutOfBoundsException
		randomAccessFile.close();
		System.out.println("修改成功~~");
	}
}
